#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;
namespace MyString
{
	class string
	{
	public:
		static const size_t npos; //npos是size_t类型的最大值
		string(const char* str = ""); //默认构造函数，缺省值为空字符串
		string(size_t n, char c); //初始化为n个字符c
		string(const string& s); //拷贝构造函数
		string& operator=(string s);
		~string();
		void swap(string& s);

		const char* c_str() const;
		size_t size() const;
		size_t capacity() const;
		bool empty() const;
		void clear();
		char& operator[](size_t pos);
		const char& operator[](size_t pos) const;

		void reserve(size_t n = 0);
		void resize(size_t n);
		void resize(size_t n, char c);

		typedef char* iterator;
		iterator begin();
		iterator end();

		typedef const char* const_iterator;
		const_iterator begin() const;
		const_iterator end() const;

		void push_back(char c);

		//尾部追加一个string对象
		string& append(const string& str);

		//从对象str的subpos位置开始获取sublen个字符，如果sublen大于剩余字符串的最大长度则将其剩余字符串全部追加
		string& append(const string& str, size_t subpos, size_t sublen = npos);

		//尾部追加字符串s
		string& append(const char* s);

		//尾部追加字符串s的前n个字符
		string& append(const char* s, size_t n);

		//尾部追加n个字符c
		string& append(size_t n, char c);

		string& operator+=(const string& str);
		string& operator+=(const char* s);
		string& operator+=(char c);

		//在指定位置pos插入字符串s，在pos以及之后的字符向后移动
		string& insert(size_t pos, const char* s);

		//在指定位置pos插入字符串对象str，在pos以及之后的字符向后移动
		string& insert(size_t pos, const string& str);

		//在指定位置pos插入字符c，在pos以及之后的字符向后移动
		string& insert(size_t pos, char c);

		//在指定位置pos插入n个字符c，在pos以及之后的字符向后移动
		string& insert(size_t pos, size_t n, char c);

		//在指定位置pos开始删除len个字符
		string& erase(size_t pos = 0, size_t len = npos);

		//从指定位置pos开始查找一个字符c，并返回字符c首次出现的位置，如果找不到就返回npos
		size_t find(char c, size_t pos = 0) const;
		//从指定位置pos开始查找字符串s，找到后返回字符串s第一个字符的下标，否则返回npos
		size_t find(const char* s, size_t pos = 0) const;


	private:
		char* _str; //存储字符串的首地址
		size_t _size; //存储字符串的长度
		size_t _capacity; //存储字符串的容量
	};

	void swap(string& s1, string& s2);

	string operator+(const string& s1, const string& s2);
	string operator+(const string& s1, const char* str);
	string operator+(const string& s1, char c);

	bool operator==(const string& lhs, const string& rhs);
	bool operator!=(const string& lhs, const string& rhs);
	bool operator>=(const string& lhs, const string& rhs);
	bool operator<=(const string& lhs, const string& rhs);
	bool operator>(const string& lhs, const string& rhs);
	bool operator<(const string& lhs, const string& rhs);

	ostream& operator<< (ostream& os, const string& str); //流插入
	istream& operator>> (istream& is, string& str); //流提取
	istream& getline(istream& is, string& str, char delim = '\n'); //自定义获取字符串
}

